package cn.changeforyou.web.nutz.common;

import java.util.ArrayList;
import java.util.List;
import org.nutz.mvc.ActionChain;
import org.nutz.mvc.ActionChainMaker;
import org.nutz.mvc.ActionInfo;
import org.nutz.mvc.NutConfig;
import org.nutz.mvc.Processor;
import org.nutz.mvc.impl.NutActionChain;
import org.nutz.mvc.impl.processor.ActionFiltersProcessor;
import org.nutz.mvc.impl.processor.AdaptorProcessor;
import org.nutz.mvc.impl.processor.EncodingProcessor;
import org.nutz.mvc.impl.processor.MethodInvokeProcessor;
import org.nutz.mvc.impl.processor.ModuleProcessor;
import org.nutz.mvc.impl.processor.UpdateRequestAttributesProcessor;
import org.nutz.mvc.impl.processor.ViewProcessor;

/**
 * @author zhyu
 */
public class MyActionChainMaker implements ActionChainMaker {

    /**
     * 该接口只有一个方法
     *
     * @param config
     * @param ai
     * @return
     */
    @Override
    public ActionChain eval(NutConfig config, ActionInfo ai) {
        // 提醒: config可以获取ioc等信息, ai可以获取方法上的各种配置及方法本身
        // 正常处理的列表
        List<Processor> list = new ArrayList<>();
//        list.add(new CorsChain());
        // 设置base/msg等内置属性
        list.add(new UpdateRequestAttributesProcessor());
        // 设置编码信息@Encoding
        list.add(new EncodingProcessor());
        // 获取入口类的对象,从ioc或直接new
        list.add(new ModuleProcessor());
        // 处理@Filters
        list.add(new ActionFiltersProcessor());
        // 处理@Adaptor
        list.add(new AdaptorProcessor());
        list.add(new ValidatorChain());
        // 执行入口方法
        list.add(new MethodInvokeProcessor());
        // 对入口方法进行渲染@Ok
        list.add(new ViewProcessor());
        try {
            for (Processor p : list) {
                p.init(config, ai);
            }
            Processor error = new Failchain();
            error.init(config, ai);
            return new NutActionChain(list, error, ai);
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            throw new RuntimeException(throwable);
        }
    }
}
